/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arbol_sintactico_abstracto;

import analizadorlexico.Token;
import tabla_de_simbolos.Clase;
import tabla_de_simbolos.Constructor;
import tabla_de_simbolos.ErrorSemantico;
import tabla_de_simbolos.TablaDeSimbolos;
import tabla_de_simbolos.Tipo;
import generador_de_codigo.GeneradorDeCodigo;
import java.io.IOException;
import tabla_de_simbolos.TipoPrimitivo;
/**
 *
 * @author Javi
 */
public class ExpBinaria extends Expresion {
    private Expresion ladoIzq;
    private Expresion ladoDer;
    private Token operador;

    public ExpBinaria(Expresion ladoIzq, Expresion ladoDer, Token operador) {
        this.ladoIzq = ladoIzq;
        this.ladoDer = ladoDer;
        this.operador = operador;
    }

    public Expresion getLadoIzq() {
        return ladoIzq;
    }

    public Expresion getLadoDer() {
        return ladoDer;
    }

    public Token getOperador() {
        return operador;
    }        

  

    @Override
    public Tipo check(Clase clase, Constructor metodo, TablaDeSimbolos ts) throws ErrorSemantico, IOException{
        Tipo t1 = ladoIzq.check(clase, metodo,ts);
        Tipo t2 = ladoDer.check(clase, metodo,ts);
        if(!t1.conforma(t2) && !t2.conforma(t1)){//operador
            throw new ErrorSemantico("Error de tipos, el tipo " + t1.getNombre() +" no conforma con " + t2.getNombre() + ". Linea " + operador.getLinea());
        }
        //mirar cada operador
        switch(operador.getLexema()){
            case "+":
                if(!t1.getNombre().equals("int"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("ADD \n");
                break;
            case "-":
                if(!t1.getNombre().equals("int"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("SUB \n");
                break;
            case "*":
               if(!t1.getNombre().equals("int"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("MUL \n");
                break;
            case "/":
                if(!t1.getNombre().equals("int"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("DIV \n");
                break;
            case "%":
                if(!t1.getNombre().equals("int"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("MOD \n");
                break;
            case "<":
                if(!t1.getNombre().equals("int"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("LT \n");
                t1 = new TipoPrimitivo(new Token("boolean","boolean",operador.getLinea()));
                break;
            case ">":
                if(!t1.getNombre().equals("int"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("GT \n");
                t1 = new TipoPrimitivo(new Token("boolean","boolean",operador.getLinea()));
                break;
            case "<=":
                if(!t1.getNombre().equals("int"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("LE \n");
                t1 = new TipoPrimitivo(new Token("boolean","boolean",operador.getLinea()));
                break;
            case ">=":
                if(!t1.getNombre().equals("int"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("GE \n");
                t1 = new TipoPrimitivo(new Token("boolean","boolean",operador.getLinea()));
                break;
            case "==":
                GeneradorDeCodigo.generar("EQ \n");
                t1 = new TipoPrimitivo(new Token("boolean","boolean",operador.getLinea()));
                break;
            case "!=":
                GeneradorDeCodigo.generar("NE \n");
                t1 = new TipoPrimitivo(new Token("boolean","boolean",operador.getLinea()));
                break;
            case "||":
                if(!t1.getNombre().equals("boolean"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("OR \n");
                t1 = new TipoPrimitivo(new Token("boolean","boolean",operador.getLinea()));
                break;
            case "&&":
                if(!t1.getNombre().equals("boolean"))
                    throw new ErrorSemantico("El operador '" + operador.getLexema() +"' no es compatible con el tipo " + t1.getNombre() + ". Linea: " + operador.getLinea());
                GeneradorDeCodigo.generar("AND \n");
                t1 = new TipoPrimitivo(new Token("boolean","boolean",operador.getLinea()));
                break;
        }
            
        return t1;      
    }
   
}
